home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
umich
/
utils
/
tosfixes
/
fser096b.lzh
/
FSER096B
/
XSDD.TXT
< prev
Wrap
Text File
|
1992-09-12
|
19KB
|
441 lines
Extended Serial Device Driver (XSDD)
Entwurf eines Protokolls mit erweiterten Funktionen zur seriellen I/O
Author: Stephan Baucke
Erste Niederschrift: 7-Sept-1992
Letzte Änderung: 11-Sept-1992
Einleitung
----------
Bekanntlich sind die Möglichkeiten des TOS zur Bedienung der seriellen Schnitt-
stellen recht beschränkt:
- die Bedienung diverser Kontrolleitungen (wie DCD, DTR, RI usw.) ist nur durch
Direktzugriff auf die Hardware möglich
- Es sind nur die von Rsconf angebotenen Baudraten einstellbar, auch wenn die
Hardware mehr erlaubt
- Der Zugriff auf eine Schnittstelle von mehreren Programmen kann nicht koordiniert
werden
- Da mit BIOS jedes Zeichen einzeln übertragen werden muß, ist die I/O-Performance
nicht sehr hoch
Im Rahmen der Entwicklung eines seriellen Treibers für MiNT, der diese Schwächen
beheben sollte, kam die Idee auf, die erweiterte Funktionalität auch unter reinem
TOS zugänglich zu machen. Dies ist ein erster Vorschlag, wie das aussehen könnte.
Im wesentlichen werden dabei die Low-Level-Routinen des MiNT-Treibers über einen
Cookie von außen zugänglich gemacht. Denkbar wäre jedoch auch, die beiden Ebenen
völlig zu trennen und den MiNT-Treiber auf einen separaten TOS-Treiber aufzu-
setzen.
Das XSDD-Protokoll
------------------
Das XSDD-Protokoll unterstützt die über Bconmap verwalteten Devices 6 bis ein-
schließlich <maptabsize+5> (soweit das zugrundeliegende TOS sie zur Verfügung
stellt), sowie das Device 1 (AUX). Operationen auf AUX beziehen sich immer auf
das zum Zeitpunkt des Aufrufs von XSDD gerade aktuelle Bconmap-Device. In Zu-
kunft wird AUX möglicherweise aus technischen Gründen nur noch dann unterstützt,
wenn das zugrundeliegende TOS kein Bconmap hat.
Der Treiber installiert einen Cookie "XSDD". Der Cookie zeigt auf den Einsprung-
punkt des XSDD-Treibers. Unmittelbar vor der Routine (also an Offset -4 vor der
Adresse aus dem Cookie) steht zur Absicherung nochmals die Long-Konstante "XSDD".
Aufruf: Welche Funktion ausgeführt werden soll, wird durch einen Opcode (WORD)
angegeben. Dieser Opcode ist bei jedem Aufruf das erste Argument. Wenn ein un-
gültiger Opcode angegeben wird, wird EINVFN zurückgeliefert.
Die Übergabe aller Parameter erfolgt nach GEMDOS-Konvention, d.h. auf dem Stack.
Der Rückgabewert wird in D0 geliefert. Außer D0 werden keine Register verändert.
Der Aufruf von XSDD darf AUSSCHLIESSLICH im Supervisor-Modus erfolgen.
Z.Zt. sind die im folgenden aufgelisteten Funktionen vorgesehen (Opcodes müssen
noch vergeben werden). Für die Parametertypen gilt folgende Vereinbarung:
BYTE: 8-Bit-Zeichen
WORD: 16-Bit signed Integer
UWORD: 16-Bit unsigned Integer
LONG: 32-Bit signed Integer
-----------------------------------------------------------------------------------
WORD XSVersion(void)
Liefert die Versionsnummer des vom XSDD-Treibers implementierten Protokolls
zurück, Major-Version im Hi-Byte, Minor-Version im Low-Byte (Beispiel: 0x0102
entspricht Version 1.2). Diese Nummer soll nicht etwa die Version des Treiber-
programms wiederspiegeln, sondern nur die des implementierten Protokolls.
Rückgabe:
Protokollversion.
-----------------------------------------------------------------------------------
WORD XSDriverInfo(BYTE *info, LONG *product, WORD *version)
Dieser Aufruf liefert einen Info-String, eine Produktkennung, sowie die Version
des jeweiligen Treiberprogramms zurück. `info' muß dabei auf einen mindestens 80
Bytes großen Puffer zeigen, in den der Info-String nullterminiert eingetragen
wird (der String kann z.B. den Author und den Namen des Treibers enthalten). In
den LONG, auf den `product' zeigt, wird die Produktkennung eingetragen, sowie in
das WORD, auf das `version' zeigt, die Treiberversion.
Rückgabe
0
-----------------------------------------------------------------------------------
WORD XSDevName(WORD device, BYTE *name)
Ermittelt den Namen des zum BIOS-Device gehörigen Ports (z.B. "Modem1"). `name'
muß auf ein mindestens 9 Bytes großes Array zeigen. Dort wird der Name nulltermi-
niert eingetragen.
Rückgabe:
0 bei Erfolg
EUNDEV - Ungültiges Device
-----------------------------------------------------------------------------------
WORD XSReserve(WORD device)
Device reservieren. Es handelt sich hier um ein "advisory" Locking, d.h. es ist
darauf angewiesen, daß jedes Programm den Lock abfragt und freiwillig auf weitere
Zugriffe verzichtet, wenn das Device bereits belegt ist. Jedes Programm hat vor
irgendeinem Zugriff auf das Device diesen Aufruf durchzuführen. Wenn das Device
noch frei war, ist es nach dem Aufruf reserviert. Wenn es bereits reserviert war,
wird ein Fehlercode zurückgeliefert. In diesem Fall sollte keinerlei Zugriff mehr
auf das Device erfolgen.
Rückgabewert:
0 - das Device ist jetzt reserviert
EACCDN - das Gerät war bereits reserviert
EUNDEV - Ungültiges Device
-----------------------------------------------------------------------------------
WORD XSRelease(WORD device)
Device wieder freigeben. Dieser Aufruf darf NUR gemacht werden, wenn vorher
ein erfolgreicher XSReserve durchgeführt werden konnte (mit Rückgabe 0).
Falls auf dem Device noch eine XSCtlSig-Routine angemeldet war, wird sie
automatisch freigegeben.
Rückgabewert:
0 bei Erfolg,
EACCDN - wenn das Device nicht reserviert war.
EUNDEV - Ungültiges Device
-----------------------------------------------------------------------------------
LONG XSCapMap(WORD device)
Fragt diverse Eigenschaften von Treiber und Device ab. Wenn kein Fehler vorliegt,
wird ein Bitvektor zurückgeliefert. Folgende Bits sind z.Zt. definiert:
#define XS_BREAK 0x01 /* Device kann Break senden */
#define XS_RTSCTS 0x02 /* Device beherrscht RTS/CTS-Handshaking */
#define XS_TANDEM 0x04 /* Device beherrscht XON/XOFF-Handshaking */
#define XS_IOBAUD 0x08 /* Device beherrscht verschiedene I- und O-Baudraten */
#define XS_BIOSRW 0x8000 /* Treiber benutzt BIOS zum Lesen/Schreiben */
Alle anderen Bits sind reserviert und sollten bis auf weiteres ignoriert
werden.
Rückgabewert:
>=0 (LONG!) - Verfügbare Fähigkeiten
EUNDEV - Ungültiges Device
-----------------------------------------------------------------------------------
LONG XSIBaud(WORD device, LONG baudrate)
Eingabe-Baudrate (genauer: bps) des angegebenen Devices setzen/abfragen. Die Baud-
rate wird unkodiert im "Klartext" angegeben (38400L entspricht z.B. 38400 bps).
Wenn -1L angegeben wird, wird die Baudrate nicht verändert (nur Abfrage). Falls
eine Baudrate angfordert wird, die auf dem Device nicht zur Verfügung steht, wird
die nächst niedrigere verfügbare eingestellt und zurückgeliefert.
Die meisten Devices unterstützen keine getrennten Baudraten für Ein- und Aus-
gabe. In diesem Fall wird mit einem XSIBaud gleichzeitig auch die Ausgabe-
Baudrate verändert (dies kann mit XSCapMap abgefragt werden).
Rückgabewert:
>0 - eingestellte Baudrate
EUNDEV - Ungültiges Device
Anmerkung: Durch die Rückgabe der nächst niedrigen verfügbaren Baudrate kann
der Aufrufer alle für dieses Device verfügbaren Baudraten durch "Abklappern"
von oben nach unten ermitteln.
-----------------------------------------------------------------------------------
LONG XSOBaud(WORD device, LONG baudrate)
Ausgabe-Baudrate (genauer: bps) des angegebenen Devices setzen/abfragen. Die
Funktionsweise ist ansonsten analog zu XSIBaud.
Die meisten Devices unterstützen keine getrennten Baudraten für Ein- und Aus-
gabe. In diesem Fall wird mit einem XSOBaud gleichzeitig auch die Eingabe-
Baudrate verändert (dies kann mit XSCapMap abgefragt werden).
Rückgabewert:
>0 - eingestellte Baudrate
EUNDEV - Ungültiges Device
-----------------------------------------------------------------------------------
WORD XSBreak(WORD device, WORD on)
Ein BREAK auf dem Device setzen/löschen. Wenn `on' ungleich 0 ist, wird BREAK
gesetzt, ansonsten gelöscht. Wenn das Device BRE